package beans;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.swing.event.ChangeEvent;

import org.primefaces.context.RequestContext;

import modelo.Cursoperiodo;
import modelo.Cursoperiodogrupo;
import modelo.Pregunta;
import modelo.Profesor;
import modelo.Respuesta;
import modelo.Tematica;
import daos.CursoPeriodoDAO;
import daos.PreguntaDAO;
import daos.RespuestaDAO;
import daos.TematicaDAO;
import daosimp.CursoPeriodoDAOIMP;
import daosimp.PreguntaDAOIMP;
import daosimp.RespuestaDAOIMP;
import daosimp.TematicaDAOIMP;

@ManagedBean
@RequestScoped
public class PreguntaBean {

	private Pregunta pregunta;
	private PreguntaDAO preguntaDAO = new PreguntaDAOIMP();
	private CursoPeriodoDAO cursoperiodoDAO = new CursoPeriodoDAOIMP();
	private TematicaDAO tematicaDAO = new TematicaDAOIMP();
	private RespuestaDAO respuestaDAO = new RespuestaDAOIMP();
	private List<Pregunta> listPregunta;
	private List<Respuesta> listRespuesta;
	private List<Cursoperiodo> cursos;
	private List<Tematica> tematicas;
	private Tematica tematicaSelec;
	private Cursoperiodo cursoperiodo;
	private Cursoperiodogrupo cpg = (Cursoperiodogrupo) FacesContext
			.getCurrentInstance().getExternalContext().getSessionMap()
			.get("cpgSelec");
	private Profesor profesorRedactor = (Profesor) FacesContext
			.getCurrentInstance().getExternalContext().getSessionMap()
			.get("profesor");
	private String enunciado, respuesta;
	private String cursoSelecId, tematicaSelecId;
	private int nivelDificultad, numRespuesta;
	private String alt1, alt2, alt3, alt4, alt5;

	public boolean cursosActivos() {
		if (cpg != null) {
			cursoSelecId = cpg.getCursoperiodo().getIdCursoPeriodo();
			obtenerTematicasxCurso();
			return true;
		}else{
			cursoSelecId="";
			cursos = cursoperiodoDAO.obtenerCursoxPeriodo();
			return false;
		}		
	}

	public void elaborarPregunta() {
		RequestContext.getCurrentInstance().openDialog("elaborarPregunta");
	}

	public String getAlt1() {
		return alt1;
	}

	public String getAlt2() {
		return alt2;
	}

	public String getAlt3() {
		return alt3;
	}

	public String getAlt4() {
		return alt4;
	}

	public String getAlt5() {
		return alt5;
	}

	public Cursoperiodo getCursoperiodo() {
		return cursoperiodo;
	}

	public CursoPeriodoDAO getCursoperiodoDAO() {
		return cursoperiodoDAO;
	}

	public List<Cursoperiodo> getCursos() {
		return cursos;
	}

	public String getCursoSelecId() {
		return cursoSelecId;
	}

	public String getEnunciado() {
		return enunciado;
	}

	public List<Pregunta> getListPregunta() {
		return listPregunta;
	}

	public List<Respuesta> getListRespuesta() {
		return listRespuesta;
	}

	public int getNivelDificultad() {
		return nivelDificultad;
	}

	public int getNumRespuesta() {
		return numRespuesta;
	}

	public Pregunta getPregunta() {
		return pregunta;
	}

	public PreguntaDAO getPreguntaDAO() {
		return preguntaDAO;
	}

	public Profesor getProfesorRedactor() {
		return profesorRedactor;
	}

	public String getRespuesta() {
		return respuesta;
	}

	public RespuestaDAO getRespuestaDAO() {
		return respuestaDAO;
	}

	public TematicaDAO getTematicaDAO() {
		return tematicaDAO;
	}

	public List<Tematica> getTematicas() {
		return tematicas;
	}

	public Tematica getTematicaSelec() {
		return tematicaSelec;
	}

	public String getTematicaSelecId() {
		return tematicaSelecId;
	}

	public void guardarPregunta(ActionEvent e) {
		pregunta = new Pregunta();
		if (validar()) {
			tematicaSelec = tematicaDAO.obtenerTematica(tematicaSelecId);
			pregunta.setIdPregunta("PREG_"
					+ String.valueOf(preguntaDAO.listarTotalPreguntas().size() + 1));
			pregunta.setTematica(tematicaSelec);
			pregunta.setEnunciadoPregunta(enunciado);
			pregunta.setFechaRedaccionPregunta(new Date());
			pregunta.setEstadoPregunta(2);
			pregunta.setNivelDificultadPregunta(nivelDificultad);
			pregunta.setProfesor(profesorRedactor);
			preguntaDAO.registrarPregunta(pregunta);
			guardarRespuestas();
			limpiar();
			FacesContext.getCurrentInstance().addMessage(null,
					new FacesMessage("Pregunta guardada exitosamente!"));
		} else {
			FacesContext.getCurrentInstance().addMessage("Complete los campos",
					new FacesMessage());
		}
	}

	public boolean validar() {
		if (tematicaSelecId == null || tematicaSelecId.equals("")) {
			return false;
		}
		return true;
	}

	public void guardarRespuestas() {
		listRespuesta = new ArrayList<>();
		for (int i = 0; i < 5; i++) {
			Respuesta r = new Respuesta();
			r.setIdRespuesta("RESP_0" + String.valueOf(respuestaDAO.listarTotalRespuestas().size() + 1));
			r.setPregunta(pregunta);
			switch (i) {
			case 0:
				r.setTextoRespuesta(alt1);
				break;
			case 1:
				r.setTextoRespuesta(alt2);
				break;
			case 2:
				r.setTextoRespuesta(alt3);
				break;
			case 3:
				r.setTextoRespuesta(alt4);
				break;
			case 4:
				r.setTextoRespuesta(alt5);
			}
			if (numRespuesta == i + 1) {
				r.setFlagRespuesta(true);
			} else {
				r.setFlagRespuesta(false);
			}
			respuestaDAO.registrarRespuesta(r);
			listRespuesta.add(r);
		}
	}

	public void limpiar() {
		enunciado = "";
		cursoSelecId="";
		tematicaSelecId="";
		alt1="";
		alt2="";
		alt3="";
		alt4="";
		alt5="";
	}

	public void obtenerTematicasxCurso() {
		tematicas = new ArrayList<Tematica>();
		cursoperiodo = cursoperiodoDAO.obtenerCursoPeriodo(cursoSelecId);
		for (Object t : cursoperiodo.getTematicas()) {
			Tematica tm = (Tematica) t;
			tematicas.add(tm);
		}
	}

	public String regresar() {
		return "profesorHome";
	}

	public void setAlt1(String alt1) {
		this.alt1 = alt1;
	}

	public void setAlt2(String alt2) {
		this.alt2 = alt2;
	}

	public void setAlt3(String alt3) {
		this.alt3 = alt3;
	}

	public void setAlt4(String alt4) {
		this.alt4 = alt4;
	}

	public void setAlt5(String alt5) {
		this.alt5 = alt5;
	}

	public void setCursoperiodo(Cursoperiodo cursoperiodo) {
		this.cursoperiodo = cursoperiodo;
	}

	public void setCursoperiodoDAO(CursoPeriodoDAO cursoperiodoDAO) {
		this.cursoperiodoDAO = cursoperiodoDAO;
	}

	public void setCursos(List<Cursoperiodo> cursos) {
		this.cursos = cursos;
	}

	public void setCursoSelecId(String cursoSelecId) {
		this.cursoSelecId = cursoSelecId;
	}

	public void setEnunciado(String enunciado) {
		this.enunciado = enunciado;
	}

	public void setListPregunta(List<Pregunta> listPregunta) {
		this.listPregunta = listPregunta;
	}

	public void setListRespuesta(List<Respuesta> listRespuesta) {
		this.listRespuesta = listRespuesta;
	}

	public void setNivelDificultad(int nivelDificultad) {
		this.nivelDificultad = nivelDificultad;
	}

	public void setNumRespuesta(int numRespuesta) {
		this.numRespuesta = numRespuesta;
	}

	public void setPregunta(Pregunta pregunta) {
		this.pregunta = pregunta;
	}

	public void setPreguntaDAO(PreguntaDAO preguntaDAO) {
		this.preguntaDAO = preguntaDAO;
	}

	public void setProfesorRedactor(Profesor profesorRedactor) {
		this.profesorRedactor = profesorRedactor;
	}

	public void setRespuesta(String respuesta) {
		this.respuesta = respuesta;
	}

	public void setRespuestaDAO(RespuestaDAO respuestaDAO) {
		this.respuestaDAO = respuestaDAO;
	}

	public void setTematicaDAO(TematicaDAO tematicaDAO) {
		this.tematicaDAO = tematicaDAO;
	}

	public void setTematicas(List<Tematica> tematicas) {
		this.tematicas = tematicas;
	}

	public void setTematicaSelec(Tematica tematicaSelec) {
		this.tematicaSelec = tematicaSelec;
	}

	public void setTematicaSelecId(String tematicaSelecId) {
		this.tematicaSelecId = tematicaSelecId;
	}

	public Cursoperiodogrupo getCpg() {
		return cpg;
	}

	public void setCpg(Cursoperiodogrupo cpg) {
		this.cpg = cpg;
	}

}
